home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Beginning Mac Programming
/
Beginning Mac Programming.bin
/
Open Me for REALbasic 3
/
REALbasic 3.2
/
Example Projects
/
Techniques
/
Examples by Thomas Tempelmann
/
TT's AliasRecord
/
Plugin Source (CW Pro 3)
/
Plugin Source.cpp
< prev
Wrap
Text File
|
1999-07-05
|
6KB
|
218 lines
/*
* Mac OS Alias Manager Plugin for REALbasic 2
*
* This code is freeware, you may use and extend it as you like.
*
* The accompanying project file was created using CodeWarrior Pro 3.
*
* It was written on June 3, 99 by Thomas Tempelmann.
*
* More RB-related stuff can be found here: <http://www.tempel.org/rb/>
*
* Enjoy and contribute!
*/
#include <string.h>
#include "rb_plugin.h"
//----------------
// plugin classes
//----------------
extern REALclassDefinition MacAliasRecordClass; // forward declaration
struct MacAliasData
{
// internal class properties
AliasHandle hdl;
Boolean needsUpdate;
};
static void MacAliasConstructor (REALobject instance, void *garbage)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
me->needsUpdate = false;
me->hdl = nil;
}
static void MacAliasDestructor (REALobject instance, void *garbage)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
if (me->hdl) {
DisposeHandle ((Handle)me->hdl);
me->hdl = nil;
}
}
static long createAlias (REALobject instance, REALfolderItem relPath, REALfolderItem target)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
if (target == NULL) return paramErr;
if (me->hdl) {
DisposeHandle ((Handle)me->hdl);
me->hdl = nil;
}
FSSpec sp1, sp2, *p1 = nil;
if (relPath) {
REALFSSpecFromFolderItem (&sp1, relPath);
p1 = &sp1;
}
REALFSSpecFromFolderItem (&sp2, target);
me->needsUpdate = false;
return NewAlias (p1, &sp2, &me->hdl);
}
static long updateAlias (REALobject instance, REALfolderItem relPath, REALfolderItem target)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
if (target == NULL) return paramErr;
if (!me->hdl) {
return paramErr;
}
Boolean changed;
FSSpec sp1, sp2, *p1 = nil;
if (relPath) {
REALFSSpecFromFolderItem (&sp1, relPath);
p1 = &sp1;
}
REALFSSpecFromFolderItem (&sp2, target);
long ret = UpdateAlias (p1, &sp2, me->hdl, &changed);
if (ret == noErr) {
me->needsUpdate = false;
ret = changed;
}
return ret;
}
static REALstring getAliasInfo (REALobject instance, long index)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
Str63 s;
if (me->hdl && GetAliasInfo (me->hdl, index, s) == noErr) {
return REALBuildString ((const char*)&s[1], s[0]);
}
return nil;
}
static REALstring getAliasRec (REALobject instance)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
if (me->hdl) {
return REALBuildString (*(Handle)me->hdl, GetHandleSize((Handle)me->hdl));
}
return nil;
}
static void setAliasRec (REALobject instance, REALstring str)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
long len = str->Length();
if (me->hdl) {
SetHandleSize ((Handle)me->hdl, len);
} else {
me->hdl = (AliasHandle) NewHandle (len);
}
if (me->hdl) {
BlockMoveData (str->CString(), *me->hdl, len);
me->needsUpdate = false;
}
}
static pascal Boolean filterThisMatch (CInfoPBPtr, Boolean*, Ptr)
{
return false;
}
static REALfolderItem resolveAlias (REALobject instance, REALfolderItem relPath, long mode)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
#if TARGET_RT_MAC_CFM
static RoutineDescriptor filterProc = BUILD_ROUTINE_DESCRIPTOR(uppAliasFilterProcInfo, filterThisMatch);
#define filterUPP &filterProc
#else
#define filterUPP filterThisMatch
#endif
if (me->hdl) {
Boolean needsUpdate;
FSSpec sp1, sp2, *relSpec;
short n = 1;
if (relPath) {
REALFSSpecFromFolderItem (&sp1, relPath);
relSpec = &sp1;
} else {
relSpec = nil;
}
OSErr err = MatchAlias (relSpec, mode | kARMSearch, me->hdl, &n, &sp2, &needsUpdate, filterUPP, nil);
if (n == 1) {
if (!err) me->needsUpdate = needsUpdate;
return REALFolderItemFromFSSpec(&sp2);
}
}
return nil;
}
static long rtnParam (REALobject instance, long param)
{
return param;
}
static long needsUpdate (REALobject instance, long param)
{
ClassData (MacAliasRecordClass, instance, MacAliasData, me);
return me->needsUpdate ? 1 : 0;
}
static REALproperty MacAliasProperties[] = {
{ nil, "noDialogs", "Integer", 0, (REALproc) rtnParam, nil, 2 },
{ nil, "attemptMount", "Integer", 0, (REALproc) rtnParam, nil, 1 },
{ nil, "allVols", "Integer", 0, (REALproc) rtnParam, nil, 8 },
{ nil, "exhaustive", "Integer", 0, (REALproc) rtnParam, nil, 0x200 },
{ nil, "relFirst", "Integer", 0, (REALproc) rtnParam, nil, 0x400 },
{ nil, "version", "Integer", 0, (REALproc) rtnParam, nil, 0x0101 },
{ nil, "needsUpdate", "Boolean", 0, (REALproc) needsUpdate },
};
static REALmethodDefinition MacAliasMethods[] = {
{ (REALproc) createAlias, REALnoImplementation, "Create(relPath as FolderItem, target as FolderItem) as Integer"},
{ (REALproc) updateAlias, REALnoImplementation, "Update(relPath as FolderItem, target as FolderItem) as Integer"},
{ (REALproc) getAliasInfo, REALnoImplementation, "GetInfo(idx as Integer) as String"},
{ (REALproc) getAliasRec, REALnoImplementation, "GetRecord() as String"},
{ (REALproc) setAliasRec, REALnoImplementation, "SetRecord(record as String)"},
{ (REALproc) resolveAlias, REALnoImplementation, "Resolve(relPath as FolderItem, mode as Integer) as FolderItem"},
};
static REALclassDefinition MacAliasRecordClass = {
kCurrentREALControlVersion,
"MacAliasRecord",
nil,
sizeof(MacAliasData),
0,
(REALproc) MacAliasConstructor,
(REALproc) MacAliasDestructor,
MacAliasProperties,
sizeof(MacAliasProperties) / sizeof(REALproperty),
MacAliasMethods,
sizeof(MacAliasMethods) / sizeof(REALmethodDefinition),
nil,
0
};
void PluginEntry (void)
{
REALRegisterClass (&MacAliasRecordClass);
}